From b010a0e868d49a7e0fb3e79e8031e1ebf58765f1 Mon Sep 17 00:00:00 2001 From: "cwc22@centipede.cl.cam.ac.uk" Date: Thu, 10 Mar 2005 14:05:30 +0000 Subject: [PATCH] bitkeeper revision 1.1236.1.73 (4230542aNzdikO2FdRgaB46eNiQNHw) Maintain count of mappings, and fast exit put_page check if none in use --- xen/common/grant_table.c | 11 ++++++++++- xen/include/xen/grant_table.h | 1 + 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/xen/common/grant_table.c b/xen/common/grant_table.c index 5ef5124960..b8302b6483 100644 --- a/xen/common/grant_table.c +++ b/xen/common/grant_table.c @@ -44,6 +44,7 @@ get_maptrack_handle( if ( unlikely((h = t->maptrack_head) == NR_MAPTRACK_ENTRIES) ) return -1; t->maptrack_head = t->maptrack[h].ref_and_flags >> MAPTRACK_REF_SHIFT; + t->map_count++; return h; } @@ -53,6 +54,7 @@ put_maptrack_handle( { t->maptrack[handle].ref_and_flags = t->maptrack_head << MAPTRACK_REF_SHIFT; t->maptrack_head = handle; + t->map_count--; } static int @@ -529,7 +531,7 @@ gnttab_unmap_grant_ref( if ( flush == 1 ) __flush_tlb_one(va); - else if ( flush ) + else if ( flush != 0 ) local_flush_tlb(); return 0; @@ -734,12 +736,19 @@ gnttab_check_unmap( int found = 0; lgt = ld->grant_table; + + /* Fast exit if we're not mapping anything using grant tables */ + if ( lgt->map_count == 0 ) + return 0; + rgt = rd->grant_table; +#ifdef GRANT_DEBUG if ( ld->id != 0 ) { DPRINTK("Foreign unref rd(%d) ld(%d) frm(%x) flgs(%x).\n", rd->id, ld->id, frame, readonly); } +#endif for ( handle = 0; handle < NR_MAPTRACK_ENTRIES; handle++ ) { diff --git a/xen/include/xen/grant_table.h b/xen/include/xen/grant_table.h index c161667cdf..9520fbca45 100644 --- a/xen/include/xen/grant_table.h +++ b/xen/include/xen/grant_table.h @@ -74,6 +74,7 @@ typedef struct { /* Mapping tracking table. */ grant_mapping_t *maptrack; unsigned int maptrack_head; + unsigned int map_count; /* Lock protecting updates to active and shared grant tables. */ spinlock_t lock; } grant_table_t; -- 2.30.2